<?php
namespace Tbf\Third\Pay\Alipay;
use Guzzle\Http\Url;
use Tbf\Component\Arrays\ArrayFunction;
/**
* 即时到帐
* 对支付的接口封装
* 减少很多灵活性,也减少调用方的复杂度
*/
/**
 * @deprecated
 */
class CreateDirectPayByUser
{
    //需要商家输入的信息 商家的id密码
    private $partner_id = '';//支付宝商户号
    private $seller_email = '';
    private $key = '';//支付宝密钥

    //url 与网站有关
    private $return_url;//显示支付结果页面,带http://
    private $notify_url;//支付完成后的回调处理页面,带http://
    private $dispatcher;

    public function __construct($config,$dispatcher)
    {
        //需要商家输入的信息 商家的id密码
        $this->seller_email		= $config['seller_email'];
        $this->partner_id		= $config['partner_id'];
        $this->key				= $config['key'];

        //url 与网站有关
        $this->return_url		= $config['return_url'];
        $this->notify_url		= $config['notify_url'];
        //配置问题
        $this->alipay_config = array(
            'key'=>$config['key'],
            'partner'=>$config['partner_id'],
            'sign_type'=>'MD5',
            'input_charset'=>'utf-8',
            'cacert'=>'',
            'transport'=>'http'
        );
        $this->dispatcher = $dispatcher;
    }
    /**
    * 支付
    * 应该是一个全新的请求,是不是一个表单
    * 用户发起支付请求,由这里跳转到支付宝
    * @param data
data struct{
    trade_id string 订单号
    money string 支付金额
    subject string 商品名称(可选)
    body string 详细内容(可选)
    good_url string 商品页面url(可选)
    extract array 附加信息,会被支付宝传回来,放在return_url里面
}
    */
    public function pay($data)
    {
        $data = ArrayFunction::completeKeys($data,
            array('trade_id','subject','money','body','good_url','extract')
            );

        /**************************请求参数**************************/

            //支付类型
        $payment_type = "1";
            //必填，不能修改
            //服务器异步通知页面路径
        $notify_url = $this->notify_url;
            //需http://格式的完整路径，不能加?id=123这类自定义参数

            //页面跳转同步通知页面路径
        $return_url = $this->return_url;
        $url_obj = Url::factory($return_url);
        $url_obj->getQuery()->set('extract',$data['extract']);
        $return_url = $url_obj->__toString();
            //需http://格式的完整路径，不能加?id=123这类自定义参数，不能写成http://localhost/

            //卖家支付宝帐户
        $seller_email = $this->seller_email;
            //必填

            //商户订单号
        $out_trade_no = $data['trade_id'];
            //商户网站订单系统中唯一订单号，必填

            //订单名称
        if (!empty($data['subject'])) {
            $subject = $data['subject'];
        } else {
            $subject = '商品名';
        }
            //必填

            //付款金额
        $total_fee = $data['money'];
            //必填

            //订单描述

        $body = $data['body'];
            //商品展示地址
        $show_url = $data['good_url'];
            //需以http://开头的完整路径，例如：http://www.xxx.com/myorder.html

            //防钓鱼时间戳
        //$anti_phishing_key = "";
            //若要使用请调用类文件submit中的query_timestamp函数

            //客户端的IP地址
        //$exter_invoke_ip = "";
            //非局域网的外网IP地址，如：221.0.0.1

        /************************************************************/

    //构造要请求的参数数组，无需改动
        $parameter = array(
            "service" => "create_direct_pay_by_user",
            "partner" => $this->partner_id,
            "payment_type"	=> $payment_type,
            "notify_url"	=> $notify_url,
            "return_url"	=> $return_url,
            "seller_email"	=> $seller_email,
            "out_trade_no"	=> $out_trade_no,
            "subject"	=> $subject,
            "total_fee"	=> $total_fee,
            //"body"	=> $body,
            //"show_url"	=> $show_url,
            //"anti_phishing_key"	=> $anti_phishing_key,
            //"exter_invoke_ip"	=> $exter_invoke_ip,
            "_input_charset"	=> 'utf-8'
            );

    //建立请求
        $alipaySubmit = new AlipaySubmit($this->alipay_config);
        $html_text = $alipaySubmit->buildRequestForm($parameter,"get", "确认");
        echo $html_text;
    }
    /**
    * 异步通知
    * 由支付宝服务器发起请求,自动输出success和fail
    * 调用完成后请直接退出controller
    * 需要使用log进行调试
    */
    public function AsyncNotice()
    {
        //计算得出通知验证结果
        $alipayNotify = new AlipayNotify($this->alipay_config);
        $verify_result = $alipayNotify->verifyNotify();

        if ($verify_result) {//验证成功
            $this->handleSuccess($_POST);
            echo "success";		//请不要修改或删除
        } else {
            $this->handleFail($_POST);
            //验证失败
            echo "fail";
        }
    }
    /**
    * 同步通知
    * 成功返回true
    * 失败返回false
    */
    public function SyncNotice()
    {
        //计算得出通知验证结果
        $alipayNotify = new AlipayNotify($this->alipay_config);
        $verify_result = $alipayNotify->verifyReturn();
        if ($verify_result) {//验证成功
            $this->handleSuccess($_GET);

            return true;
        } else {
            $this->handleFail($_GET);

            return false;
        }
    }
    protected function handleSuccess($data)
    {
        //商户订单号
        $out_trade_no = $data['out_trade_no'];
        //支付宝交易号
        $trade_no = $data['trade_no'];
        //交易状态
        $trade_status = $data['trade_status'];
        $event = new Event($data);
        $this->dispatcher->dispatch(EventList::NOTICE_SUCCESS,$event);
    }
    protected function handleFail($data)
    {
        $event = new Event($data);
        $this->dispatcher->dispatch(EventList::NOTICE_FAIL,$event);
    }
}
